/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package practica1.ui.tablaPoblacion;

import java.awt.Component;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.EventObject;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
import practica1.util.JTextFieldNumerico;

/**
 * Clase que implementa un TableCellEditor y la cual devuelve un JTextFieldNumerico
 * para permitir solo escribir números en la tabla
 * @author Miguel González - Ceura
 */
public class TablaCellEditorTextField  implements TableCellEditor {
    //TextField que es el objeto editable
    private JTextFieldNumerico textField;
    //Eventos que se producen
    private ArrayList<CellEditorListener> cellEditorListener;
    protected ChangeEvent changeEvent = new ChangeEvent(this);
    //Contendrá la fila y columna del elemento que se esté editando actualmente
    private int row;
    private int column;
    
    /**
     * Constructor por defecto del cell editor
     */
    public TablaCellEditorTextField() {
        //Nuestro textfield sólo permite números
        textField = new JTextFieldNumerico();

        //Creamos un listener
        cellEditorListener = new ArrayList<CellEditorListener>();
    }
    
    /**
     * Devuelve el componente que se va a representar en pantalla que permite
     * al usuario editar el campo (JTextEditor)
     * @param table Tabla que llama al cell editor
     * @param value Valor que va a ser editado
     * @param isSelected Devuelve verdad si la celda está seleccionada, sino falso
     * @param row Fila de la celda
     * @param column Columna de la celda
     * @return Devuelve el componente que representa el editor del campo
     */
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        //Actualizamos la fila y columna del elemento editable
        this.row = row;
        this.column = column;
        
        //Agregamos el valor de la fila/columna al textfield
        textField.setText((String)value);

        //Le decimos que estará todo el texto seleccionado por defecto
        textField.selectAll();
        
        //Devolvemos el textfield
        return textField;
    }

    /**
     * Devuelve el valor que ha editado el usuario
     * @return Object Objeto de tipo String
     */
    @Override
    public Object getCellEditorValue() {
        //Devolvemos el valor de la celda
        return textField.getText();
    }
    
    /**
     * Devuelve la fila que ha editado el usuario
     * @return int row
     */
    public int getRow() {
        return row;
    }
    
    /**
     * Devuelve la columna que ha editado el usuario
     * @return int column
     */
    public int getColumn() {
        return column;
    }

    /**
     * Devuelve si la celda es editable o no lo es, solo permitimos editar con
     * doble click sobre la misma.
     * @param evt EventObject
     * @return Devuelve verdad si lo es, sino falso.
     */
    @Override
    public boolean isCellEditable(EventObject evt) {
        if (evt instanceof MouseEvent) {
            return ((MouseEvent)evt).getClickCount() >= 2;
        }
        return false;
    }

    /**
     * Devuelve si la celda debe ser seleccionada al editarse
     * @param anEvent EventObject
     * @return Devuelve siempre true
     */
    @Override
    public boolean shouldSelectCell(EventObject anEvent) {
        return true;
    }

    /**
     * Devuelve si la ceda ha dejado de ser editable, además notifica de ello
     * @return Devuelve siempre verdad
     */
    @Override
    public boolean stopCellEditing() {
        fireEditingStopped();
        return true;
    }

    /**
     * Notifica que se ha cancelado la edición
     */
    @Override
    public void cancelCellEditing() {
        fireEditingCanceled();
    }

    /**
     * Permite escuchar al cell editor
     * @param l CellEditorListener
     */
    @Override
    public void addCellEditorListener(CellEditorListener l) {
        if(l != null) {
            cellEditorListener.add(l);
        }
    }

    /**
     * Permite dejar de escuchar al cell editor
     * @param l 
     */
    @Override
    public void removeCellEditorListener(CellEditorListener l) {
        cellEditorListener.remove(l);
    }
    
    /**
     * Notifica a todos los que escuchan al cell editor que se ha dejado de editar
     */
    protected void fireEditingStopped() {
        for (int i = 0; i < cellEditorListener.size(); i++) {
            cellEditorListener.get(i).editingStopped(changeEvent);
        }
    }

    /**
     * Notifica a todos los que escuchan al cell editor que se ha cancelado la edición
     */
    protected void fireEditingCanceled() {
        for (int i = 0; i < cellEditorListener.size(); i++) {
            cellEditorListener.get(i).editingCanceled(changeEvent);
        }
    }
}
